﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
 * 1 为什么要使用委托
 * 需要讲一个方法作为参数传给另外一个函数时
 * 2委托声明
 * 委托声明签名必须和方法签名一致
 * 3匿名函数
 * 当方法在整个程序生命周期中只需要执行一次时使用,匿名函数的签名要与委托一样
 * lamda表达式中=>表示goes to，意思是到方法体中去执行
 * 4泛型委托
 * 5多播委托
 * 委托变量可以指向多个方法
 * 
 */
namespace 委托
{
    class Program
    {
        delegate string del();
        delegate string dele(string str);
        delegate A delea<A>(A t1,A t2);
        delegate void DuoBoWeiTuo();

        static void Main(string[] args)
        {
            //---------------------委托------------------------//
            //del deltest = new del(SayHelloChinese);
            //del deltest = SayHelloChinese;

            //Console.WriteLine(deltest());
            //Console.ReadKey();

            //---------------------匿名函数--------------------//
            //string str = SayUnknow(delegate() { return "萨瓦迪卡"; });
            //Console.WriteLine(str);
            //Console.ReadKey();

            //del deltest = delegate() { return "萨瓦迪卡"; };
            //Console.WriteLine(deltest());
            //Console.ReadKey();

            //------lamda表达式-属于匿名函数更简单的一种写法-----------//
            //dele deltest = (string str) => { return str; };           
            //Console.WriteLine(deltest("萨瓦迪卡"));
            //Console.ReadKey();

            //List<int> list = new List<int>() { 1,2,3,4,5,6,7};
            //list.RemoveAll(n=>n>4);
            //foreach (int item in list)
            //{
            //    Console.WriteLine(item);
            //}
            //Console.ReadKey();

            //---------------------泛型委托------------------//
            //delea<string> deltest = (string str1, string str2) => { return str1 + str2; };
            //delea<int> deltest1 = (int str1, int str2) => { return str1 + str2; };
            //Console.WriteLine(deltest("萨瓦迪卡","hello"));
            //Console.WriteLine(deltest1(1,2));
            //Console.WriteLine(GetSum<int>(3,4,deltest1));
            //Console.ReadKey();

            //----------------------多播委托-----------------//
            Console.WriteLine("委托赋值测试");
            DuoBoWeiTuo deltest = SayT1;           
            deltest();
            Console.WriteLine("委托+=测试");
            deltest += SayT2;
            deltest += SayT3;
            deltest += SayT4;
            deltest();
            Console.WriteLine("委托-=测试");
            deltest -= SayT4;
            deltest();

            Console.WriteLine("委托赋值测试");
            deltest = SayT3;
            deltest();
            Console.ReadKey();
        }

        static A GetSum<A>(A t1,A t2,delea<A> del)
        {
            return del(t1,t2);
        }
        static string SayUnknow(del del)      
        {
            return del();
        }

        static string SayHelloChinese()
        {
            return "你好";
        }
        static string SayHelloEnglish()
        {
            return "hello";
        }
        static void SayT1()
        {
            Console.WriteLine("我是T1");
        }
        static void SayT2()
        {
            Console.WriteLine("我是T2");
        }
        static void SayT3()
        {
            Console.WriteLine("我是T3");
        }
        static void SayT4()
        {
            Console.WriteLine("我是T4");
        }
    }
}
